home *** CD-ROM | disk | FTP | other *** search
- /*******************************************************************************
- +
- + LEDA 2.1.1 11-15-1991
- +
- +
- + seg_tree.h
- +
- +
- + Copyright (c) 1991 by Max-Planck-Institut fuer Informatik
- + Im Stadtwald, 6600 Saarbruecken, FRG
- + All rights reserved.
- +
- *******************************************************************************/
-
-
-
-
-
- // ------------------------------------------------------------------
- //
- // full dynamic Segment Trees
- //
- // Michael Wenzel (1990)
- //
- // Implementation follows
- // Kurt Mehlhorn: Data Structures and Algorithms, Vol. 3
- //
- // ------------------------------------------------------------------
-
-
- #ifndef SEGMENTTREEH
- #define SEGMENTTREEH
-
-
- #include <LEDA/bb_tree.h>
- #include <LEDA/list.h>
-
- // ------------------------------------------------------------------
- // declarations and definitions
- // -----------------------------------------------------------------
-
-
- class h_segment;
- typedef h_segment* h_segment_p;
-
- class seg_node_tree;
- typedef seg_node_tree* seg_node_list;
-
-
- typedef bb_node* seg_tree_item;
- declare(list,seg_tree_item);
-
- //------------------------------------------------------------------
- // class h_segment
- //------------------------------------------------------------------
-
- class h_segment {
-
- ent _x0;
- ent _x1;
- ent _y;
- ent _inf;
-
- public:
-
- ent& x0() { return _x0; }
- ent& x1() { return _x1; }
- ent& y() { return _y; }
- ent& info() { return _inf; }
-
- h_segment()
- {
- _x0 = _x1 = _y = _inf = 0;
- }
-
- h_segment(ent x0, ent x1, ent y, ent i=0)
- {
- _x0 = x0;
- _x1 = x1;
- _y = y;
- _inf = i;
- }
-
- OPERATOR_NEW(4)
- OPERATOR_DEL(4)
-
- friend ostream& operator<<(ostream&, h_segment&);
- friend class Segment_Tree;
- friend class seg_node_tree;
-
- };
-
-
- /*------------------------------------------------------------------
- class seg_node_tree = Dictionary(seg_tree_item , void* )
- -------------------------------------------------------------------*/
-
- struct seg_node_tree : public bb_tree {
-
- Segment_Tree* father;
-
- int cmp(ent& x,ent& y) ;
-
- list(seg_tree_item) query(ent, ent);
- list(seg_tree_item) all_items();
-
- int defined(h_segment_p y) { return bb_tree::member(Ent(y)); }
- seg_tree_item lookup(h_segment_p y) { return bb_tree::lookup(Ent(y)); }
- seg_tree_item locate(h_segment_p y) { return bb_tree::locate(Ent(y)); }
- seg_tree_item ord(int y) { return bb_tree::ord(int(y)); }
- seg_tree_item insert(h_segment_p y, ent i=0 )
- { return bb_tree::insert(Ent(y),i); }
- void del(h_segment_p y) { delete bb_tree::del(Ent(y)); }
- void del_item(seg_tree_item it) { del(key(it)); }
-
- h_segment_p& key(seg_tree_item it)
- { if (!it) error_handler(1,"seg_tree_item gleich nil");
- return (h_segment_p&)it->ke ; }
- ent& info(seg_tree_item it) { return key(it)->info(); }
- void change_inf(seg_tree_item it, ent i) { key(it)->info() = i; }
-
- seg_node_tree(Segment_Tree* p) {father = p;}
- ~seg_node_tree() {}
-
- friend class Segment_Tree;
-
- } ;
-
-
- #define forall_seg_tree_items(a,b) for ((b).init_iterator(); a=(b).move_iterator(); )
-
-
-
- //------------------------------------------------------------------
- // class segment_tree
- //------------------------------------------------------------------
-
- class Segment_Tree : public bb_tree {
-
-
- virtual h_segment_p new_y_h_segment(ent y)
- { cout << "error: virtual new_y_h_segment\n"; y=0; return 0; }
-
- virtual int cmp_dim1(ent& x,ent& y) {return int(x)-int(y);}
- virtual int cmp_dim2(ent& x,ent& y) {return int(x)-int(y);}
-
- virtual void clear_dim1(ent& x) { x=0; }
- virtual void clear_dim2(ent& x) { x=0; }
- virtual void clear_info(ent& x) { x=0; }
-
- virtual void copy_dim1(ent& x) { x=x; }
- virtual void copy_dim2(ent& x) { x=x; }
- virtual void copy_info(ent& x) { x=x; }
-
- int seg_cmp(h_segment_p p, h_segment_p q);
-
- void lrot(bb_item , bb_item);
- void rrot(bb_item , bb_item);
- void ldrot(bb_item , bb_item);
- void rdrot(bb_item , bb_item);
-
- void change_inf(bb_item it, seg_node_list i) { info(it) = i; }
- ent& key(bb_item it)
- { if (!it) error_handler(1,"bb_item in segment_tree gleich nil");
- return it->ke; }
- seg_node_list& info(bb_item it) { return (seg_node_list&)(bb_tree::info(it)); }
-
- int start_coord(bb_item& x,seg_tree_item& i)
- { return (!cmp(key(x),x0(i))); }
- int end_coord(bb_item& x,seg_tree_item& i)
- { return (!cmp(key(x),x1(i))); }
-
- int empty(bb_item);
- void clear(bb_item& );
- void print(bb_item , string);
-
- protected:
-
- seg_node_tree r; // tree with all segments
-
-
- int cmp_dummy(int a, int b, int c);
-
-
- public :
-
- int cmp(ent& x,ent& y)
- { cout << "error: Segment_Tree::cmp\n"; x=y=0; return 0; }
-
- ent x0(seg_tree_item x) { return (r.key(x))->_x0; }
- ent x1(seg_tree_item x) { return (r.key(x))->_x1; }
- ent y(seg_tree_item x) { return (r.key(x))->_y; }
- ent& inf(seg_tree_item x) { return r.info(x); }
-
- ent& x0(h_segment_p x) { return x->_x0; }
- ent& x1(h_segment_p x) { return x->_x1; }
- ent& y(h_segment_p x) { return x->_y; }
- ent& inf(h_segment_p x) { return x->_inf; }
-
- void change_inf(seg_tree_item x, ent i) { r.info(x) = i; }
-
- seg_tree_item insert(ent, ent, ent, ent i=0 );
-
- void del(ent, ent, ent);
- void del_item(seg_tree_item it) { del(x0(it),x1(it),y(it)) ; }
-
-
- seg_tree_item lookup(ent, ent, ent );
- int member(ent x0, ent x1, ent y) { return (lookup(x0,x1,y)!=0 ) ; }
-
- list(seg_tree_item) query(ent, ent, ent );
- list(seg_tree_item) x_infinity_query(ent, ent );
- list(seg_tree_item) y_infinity_query(ent );
- list(seg_tree_item) all_items();
-
- void clear_tree();
-
- Segment_Tree();
- ~Segment_Tree();
-
- int size() { return r.size(); }
- int empty() { return (r.size()==0) ; }
-
- seg_tree_item y_min() { return r.min(); }
- seg_tree_item y_max() { return r.max(); }
-
- void init_iterator() { r.init_iterator(); }
- seg_tree_item move_iterator() { return r.move_iterator(); }
-
- void print_tree() { print(root,""); }
-
-
- friend class seg_node_tree;
-
- };
-
-
- //------------------------------------------------------------------
- // typed segment_tree
- //------------------------------------------------------------------
-
- #define segment_tree(type1,type2,itype) name4(type1,type2,itype,segment_tree)
-
- #define segment_treedeclare3(type1,type2,itype)\
- \
- struct segment_tree(type1,type2,itype) : public Segment_Tree {\
- \
- h_segment_p new_y_h_segment(ent y)\
- { type1 x1;\
- type2 x2;\
- return new h_segment(Copy(x1),Copy(x2),y);\
- }\
- \
- int cmp_dim1(ent& x,ent& y) { return compare(*(type1*)&x,*(type1*)&y); }\
- int cmp_dim2(ent& x,ent& y) { return compare(*(type2*)&x,*(type2*)&y); }\
- \
- void clear_dim1(ent& x) { Clear(*(type1*)&x); }\
- void clear_dim2(ent& x) { Clear(*(type2*)&x); }\
- void clear_info(ent& x) { Clear(*(itype*)&x); }\
- \
- void copy_dim1(ent& x) { x = Copy(*(type1*)&x); }\
- void copy_dim2(ent& x) { x = Copy(*(type2*)&x); }\
- void copy_info(ent& x) { x = Copy(*(itype*)&x); }\
- \
- int cmp(ent& x,ent& y) { return compare((type1&)x,(type1&)y); }\
- \
- type1 x0(seg_tree_item it) { return type1(Segment_Tree::x0(it)); }\
- type1 x1(seg_tree_item it) { return type1(Segment_Tree::x1(it)); }\
- type2 y(seg_tree_item it) { return type2(Segment_Tree::y(it)); }\
- itype inf(seg_tree_item it) { return itype(Segment_Tree::inf(it));}\
- \
- seg_tree_item insert(type1 x0, type1 x1, type2 y, itype i)\
- { return Segment_Tree::insert(Ent(x0),Ent(x1),Ent(y),Ent(i)); }\
- \
- void del(type1 x0, type1 x1, type2 y)\
- { Segment_Tree::del(Ent(x0),Ent(x1),Ent(y)); }\
- \
- seg_tree_item lookup(type1 x0, type1 x1, type2 y)\
- { return Segment_Tree::lookup(Ent(x0),Ent(x1),Ent(y)); }\
- \
- int member(type1 x0, type1 x1, type2 y)\
- { return Segment_Tree::member(Ent(x0),Ent(x1),Ent(y)); }\
- \
- list(seg_tree_item) query(type1 x,type2 y0,type2 y1)\
- { return Segment_Tree::query(Ent(x),Ent(y0),Ent(y1)); }\
- \
- list(seg_tree_item) x_infinity_query(type2 y0,type2 y1)\
- { return Segment_Tree::x_infinity_query(Ent(y0),Ent(y1)); }\
- \
- list(seg_tree_item) y_infinity_query(type1 x)\
- { return Segment_Tree::y_infinity_query(Ent(x)); }\
- \
- \
- segment_tree(type1,type2,itype)() {}\
- ~segment_tree(type1,type2,itype)()\
- { seg_tree_item z;\
- forall_seg_tree_items(z,r)\
- { Clear(x0(z)); \
- Clear(x1(z)); \
- Clear(y(z)); \
- Clear(inf(z)); \
- delete r.key(z); }\
- }\
- \
- } ;
-
-
- //------------------------------------------------------------------
- // Iterator
- //------------------------------------------------------------------
-
- #define forall_seg_tree_items(a,b) for ((b).init_iterator(); a=(b).move_iterator(); )
-
-
- #endif
-